//
//  BigUInt.h
//  BigNum
//
//  Created by Sam Jaffe on 9/18/12.
//  Copyright (c) 2012 Sam Jaffe. All rights reserved.
//

#pragma once

#include "BigNum.h"

class BigInt;
template <class T>
class Decimal;

class BigUInt : public BigNumber {
public:
    BigUInt(const unsigned long long value);
    BigUInt();
    BigUInt(const BigUInt& copy);
    BigUInt(BigUInt&& copy);
    BigUInt(const BigInt& that);
    
    virtual BigNumber operator- () const;
    
    template <class T>
    BigInt operator+ (const Decimal<T>& b) const;
    template <class T>
    BigInt operator- (const Decimal<T>& b) const;
    template <class T>
    BigInt operator* (const Decimal<T>& b) const;
    template <class T>
    BigInt operator/ (const Decimal<T>& b) const;
    template <class T>
    BigInt operator% (const Decimal<T>& b) const;
    
    virtual bool operator== (const BigNumber& b) const;
    virtual bool operator!= (const BigNumber& b) const;
    virtual bool operator>= (const BigNumber& b) const;
    virtual bool operator> (const BigNumber& b) const;
    virtual bool operator<= (const BigNumber& b) const;
    virtual bool operator< (const BigNumber& b) const;
    
    template <class T>
    bool operator== (const Decimal<T>& b) const;
    template <class T>
    bool operator!= (const Decimal<T>& b) const;
    template <class T>
    bool operator>= (const Decimal<T>& b) const;
    template <class T>
    bool operator> (const Decimal<T>& b) const;
    template <class T>
    bool operator<= (const Decimal<T>& b) const;
    template <class T>
    bool operator< (const Decimal<T>& b) const;
};

inline bool BigUInt::operator== (const BigNumber& b) const {
    return BigNumber::operator==(b);
}

inline bool BigUInt::operator!= (const BigNumber& b) const {
    return BigNumber::operator!=(b);
}

inline bool BigUInt::operator>= (const BigNumber& b) const {
    return BigNumber::operator>=(b);
}

inline bool BigUInt::operator> (const BigNumber& b) const {
    return BigNumber::operator>(b);
}

inline bool BigUInt::operator<= (const BigNumber& b) const {
    return BigNumber::operator<=(b);
}

inline bool BigUInt::operator< (const BigNumber& b) const {
    return BigNumber::operator<(b);
}

template <class T>
inline bool BigUInt::operator== (const Decimal<T>& b) const {
    return ((Decimal<T>) *this) == b;
}
